package cn.catsdad.base.service;

import cn.catsdad.base.entity.BaseEntity;
import cn.catsdad.base.page.PageBean;
import cn.catsdad.base.page.PageParam;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 最上层service，抽象出所有service动作
 *
 * @author xuyl
 * @version V1.0.0 2024/7/6
 * @since V100R001
 */
public interface IBaseService<T extends BaseEntity, ID extends Serializable> {

    /**
     * 保存
     *
     * @param entity 保存的实体
     */
    void save(T entity);

    /**
     * 批量保存
     *
     * @param entities 保存的实体集合
     */
    void saveAll(Collection<T> entities);

    /**
     * 根据id删除
     *
     * @param id 要删除的id
     */
    void deleteById(ID id);

    /**
     * 根据id批量删除
     *
     * @param ids 要删除的id集合
     */
    void deleteByIds(Collection<ID> ids);

    /**
     * 根据实体删除
     *
     * @param entity 实体
     */
    void deleteByEntity(T entity);

    /**
     * 根据实体批量删除
     *
     * @param entities 实体集合
     */
    void deleteByEntities(Collection<T> entities);

    /**
     * 根据id查询
     *
     * @param ids id集合
     * @return 实体集合
     */
    List<T> queryByIds(Collection<ID> ids);

    /**
     * 根据id查询
     *
     * @param id id
     * @return 实体
     */
    T queryById(ID id);

    /**
     * 查询map，key为id，value为实体
     *
     * @param ids id集合
     * @return map
     */
    Map<ID, T> queryMap(Collection<ID> ids);

    /**
     * 分页查询
     *
     * @param pageBean  分页对象
     * @param pageParam 查询参数
     */
    void pageQuery(PageBean<T> pageBean, PageParam pageParam);

    /**
     * 批量保存，可根据实体状态自行判断insert还是update
     *
     * @param entities 实体列表
     */
    void batchSave(Collection<T> entities);

    /**
     * 批量插入，只能进行插入
     *
     * @param entities 实体集合
     */
    void batchInsert(Collection<T> entities);

    /**
     * 批量更新，只能进行更新
     *
     * @param entities 实体集合
     */
    void batchUpdate(Collection<T> entities);

    void logicDeleteById(ID id);

    void logicDeleteByIds(Collection<ID> ids);

    void logicDeleteByEntity(T entities);

    void logicDeleteByEntities(Collection<T> entities);

    List<T> queryByIdsWithIsDeletedFalse(Collection<ID> ids);

    T queryByIdWithIsDeletedFalse(ID id);

    Map<ID, T> queryMapWithIsDeletedFalse(Collection<ID> ids);

}
